package top.dotgo.kit.oss;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;

import java.util.List;


/**
 * @author : lin
 * @date : 2019/03/03 15:20
 * @description :
 * oss中 文件的相关操作方法
 */
public class OssObjectKit extends OssBaseKit {

    private static OssObjectKit ossKit;

    private OssObjectKit() {
    }

    public static OssObjectKit get() {
        initClient();
        if (ossKit == null) {
            synchronized (OssPutKti.class) {
                if (ossKit == null) {
                    ossKit = new OssObjectKit();
                }
            }
        }
        return ossKit;
    }

    /**
     * 判断文件是否存在
     *
     * @param key oss中的key （如果有文件夹 需要包含文件夹）
     * @return boolean
     */
    public boolean exists(String key) {

        try {
            // Object是否存在
            boolean isExists = ossClient.doesObjectExist(BUCKET, key);
            return isExists;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭client
            ossClient.shutdown();
        }
        return false;
    }

    /**
     * 存储空间下的文件，默认列举100个文件。
     *
     * @param key
     * @return
     */
    public List<OSSObjectSummary> list(String key) {
        try {
            // 列举文件。 如果不设置KeyPrefix，则列举存储空间下所有的文件。
            ObjectListing objectListing = ossClient.listObjects(BUCKET, key);
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            return sums;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
        return null;
    }

    /**
     * 文件列表
     *
     * @return
     */
    public List<OSSObjectSummary> listAll() {
        try {
            // 列举文件。 如果不设置KeyPrefix，则列举存储空间下所有的文件。
            ObjectListing objectListing = ossClient.listObjects(BUCKET);
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            return sums;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
        return null;
    }

    /**
     * 删除指定文件
     *
     * @param key oss中的key （如果有文件夹 需要包含文件夹）
     * @return boolean
     */
    public boolean delete(String key) {

        try {
            // 删除Object
            ossClient.deleteObject(BUCKET, key);
            return true;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭client
            ossClient.shutdown();

        }
        return false;

    }

    /**
     * 删除多个文件
     *
     * @param keys 要删除的key列表
     * @return 返回删除失败的key
     */
    public List<String> delete(List<String> keys) {

        try {
            DeleteObjectsRequest request = new DeleteObjectsRequest(BUCKET);
            request.setKeys(keys);
            //true简单模式，false详细模式
            request.setQuiet(true);
            DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(request);

            List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();

            return deletedObjects;
        } catch (OSSException | ClientException e) {
            e.printStackTrace();
        } finally {
            // 关闭client
            ossClient.shutdown();

        }
        return keys;

    }


}
